﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Globalization;

namespace PagamentoDigital {
    public class RetornoVenda {

        private long _idTransacao;
        private DateTime _dataTransacao;
        private DateTime _dataCredito;
        private double _valorOriginal;
        private double _valorLoja;
        private double _valorTotal;
        private double _desconto;
        private double _acrescimo;
        private MeioPagamento _tipoPagamento;
        private int _parcelas;
        private double _valorFrete;
        private string _tipoFrete;
        private bool _clienteQuerReceberInformacoes;
        private string _idPedido;
        private string _free;
        private string _emailVendedor;
        private StatusTransacao _status;
        private Cliente _cliente;
        private IList<Produto> _produtos;

        /** Properties **/
        public long IdTransacao {
            get { return _idTransacao; }
            set { _idTransacao = value; }
        }

        public DateTime DataTransacao {
            get { return _dataTransacao; }
            set { _dataTransacao = value; }
        }

        public DateTime DataCredito {
            get { return _dataCredito; }
            set { _dataCredito = value; }
        }

        public double ValorOriginal {
            get { return _valorOriginal; }
            set { _valorOriginal = value; }
        }

        public double ValorLoja {
            get { return _valorLoja; }
            set { _valorLoja = value; }
        }

        public double ValorTotal {
            get { return _valorTotal; }
            set { _valorTotal = value; }
        }

        public double Desconto {
            get { return _desconto; }
            set { _desconto = value; }
        }

        public double Acrescimo {
            get { return _acrescimo; }
            set { _acrescimo = value; }
        }

        public MeioPagamento TipoPagamento {
            get { return _tipoPagamento; }
            set { _tipoPagamento = value; }
        }

        public int Parcelas {
            get { return _parcelas; }
            set { _parcelas = value; }
        }

        public double ValorFrete {
            get { return _valorFrete; }
            set { _valorFrete = value; }
        }

        public string TipoFrete {
            get { return _tipoFrete; }
            set { _tipoFrete = value; }
        }

        public bool ClienteQuerReceberInformacoes {
            get { return _clienteQuerReceberInformacoes; }
            set { _clienteQuerReceberInformacoes = value; }
        }

        public string IdPedido {
            get { return _idPedido; }
            set { _idPedido = value; }
        }

        public string Free {
            get { return _free; }
            set { _free = value; }
        }

        public string EmailVendedor {
            get { return _emailVendedor; }
            set { _emailVendedor = value; }
        }

        public StatusTransacao Status {
            get { return _status; }
            set { _status = value; }
        }

        public Cliente Cliente {
            get { return _cliente; }
            set { _cliente = value; }
        }

        public IList<Produto> Produtos {
            get { return _produtos; }
            set { _produtos = value; }
        }

        public RetornoVenda() {

        }

        internal static RetornoVenda CriarViaRetornoAutomatico(NameValueCollection nvc) {
            //Ajustes necessários para a formatação correta dos dados
            CultureInfo culture = new CultureInfo("pt-BR", false);
            culture.NumberFormat.NumberDecimalSeparator = ".";
            culture.NumberFormat.NumberGroupSeparator = string.Empty;
            culture.NumberFormat.PercentDecimalSeparator = ".";
            culture.NumberFormat.PercentGroupSeparator = string.Empty;

            RetornoVenda retorno = new RetornoVenda();

            //Pagamento
            retorno.IdTransacao = Convert.ToInt64(nvc["id_transacao"], culture);
            retorno.DataTransacao = DateTime.ParseExact(nvc["data_transacao"], "dd/MM/yyyy", culture);
            retorno.DataCredito = DateTime.ParseExact(nvc["data_credito"], "dd/MM/yyyy", culture);
            retorno.ValorOriginal = Convert.ToDouble(nvc["valor_original"], culture);
            retorno.ValorLoja = Convert.ToDouble(nvc["valor_loja"], culture);
            retorno.ValorTotal = Convert.ToDouble(nvc["valor_total"], culture);
            retorno.Desconto = Convert.ToDouble(nvc["desconto"], culture);
            retorno.Acrescimo = Convert.ToDouble(nvc["acrescimo"], culture);

            retorno.Parcelas = Convert.ToInt32(nvc["parcelas"], culture);
            if (nvc["tipo_pagamento"].ToLower().StartsWith("transf")) {
                if (nvc["tipo_pagamento"].ToLower().EndsWith("brasil")) {
                    retorno.TipoPagamento = MeioPagamento.OnlineBancoDoBrasil;
                } else if (nvc["tipo_pagamento"].ToLower().EndsWith("bradesco")) {
                    retorno.TipoPagamento = MeioPagamento.OnlineBancoBradesco;
                } else if (nvc["tipo_pagamento"].ToLower().EndsWith("itaú")) {
                    retorno.TipoPagamento = MeioPagamento.OnlineBancoItau;
                }
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("boleto")) {
                retorno.TipoPagamento = MeioPagamento.Boleto;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("visa")) {
                retorno.TipoPagamento = MeioPagamento.Visa;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("master")) {
                retorno.TipoPagamento = MeioPagamento.Mastercard;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("american")) {
                retorno.TipoPagamento = MeioPagamento.AmericanExpress;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("diners")) {
                retorno.TipoPagamento = MeioPagamento.Diners;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("aura")) {
                retorno.TipoPagamento = MeioPagamento.AURA;
            } else if (nvc["TipoPagamento"].ToLower().StartsWith("hiper")) {
                retorno.TipoPagamento = MeioPagamento.Hipercard;
            }

            retorno.ValorFrete = Convert.ToDouble(nvc["frete"], culture);
            retorno.TipoFrete = nvc["frete"];
            retorno.ClienteQuerReceberInformacoes = nvc["informacoes_loja"].ToLower().StartsWith("s");
            retorno.IdPedido = nvc["id_pedido"];
            retorno.Free = nvc["free"];
            retorno.EmailVendedor = nvc["email_vendedor"];

            retorno.Status = (StatusTransacao)Convert.ToInt32(nvc["cod_status"]);

            //Cliente
            retorno.Cliente = new Cliente();
            retorno.Cliente.Nome = nvc["cliente_nome"];
            retorno.Cliente.Email = nvc["cliente_email"];
            retorno.Cliente.RG = nvc["cliente_rg"];
            retorno.Cliente.DataEmissaoRG = DateTime.ParseExact(nvc["cliente_data_emissao_rg"], "dd/MM/yyyy", culture);
            retorno.Cliente.OrgaoEmissorRG = nvc["cliente_orgao_emissor_rg"];
            retorno.Cliente.UFEmissorRG = nvc["cliente_estado_emissor_rg"];
            retorno.Cliente.CPF = Convert.ToInt64(nvc["cliente_cpf"]);
            retorno.Cliente.Sexo = nvc["cliente_sexo"].ToLower().StartsWith("m") ? Sexo.Masculino : Sexo.Feminino;
            retorno.Cliente.DataNascimento = DateTime.ParseExact(nvc["cliente_data_nascimento"], "dd/MM/yyyy", culture);
            retorno.Cliente.Endereco = nvc["cliente_endereco"];
            retorno.Cliente.ComplementoEndereco = nvc["cliente_complemento"];
            retorno.Cliente.Bairro = nvc["cliente_bairro"];
            retorno.Cliente.Cidade = nvc["cliente_cidade"];
            retorno.Cliente.UF = nvc["cliente_estado"];
            retorno.Cliente.Cep = nvc["cliente_cep"];

            //Produtos
            retorno.Produtos = new List<Produto>();
            for (int i = 1; i <= int.Parse(nvc["qtde_produtos"]); i++) {
                Produto produto = new Produto();
                produto.Codigo = nvc["produto_codigo_" + i];
                produto.Nome = nvc["produto_descricao_" + i];
                produto.Descricao = nvc["produto_extra_" + i];
                produto.Valor = Convert.ToDouble(nvc["produto_valor_" + i], culture);
                produto.Quantidade = int.Parse(nvc["produto_qtde_" + i]);
                retorno.Produtos.Add(produto);
            }

            return retorno;
        }
    }

    public enum StatusTransacao {
        EmAndamento = 0,
        Concluida = 1,
        Cancelada = 2
    }
}
